from math import *
from PublicReference.base import *
class 主动技能(技能):
    #只扩展了技能的三条属性，第一条技能hit默认1,2、3条hit默认为0，需要手动赋值
    #如果需要继续扩展，可以在各自职业类内继承后自行扩展，同时需要重写下等效百分比函数
    #固伤在填写基础及成长的时候需要注意，技能面板/独立得到的成长及数值需要*100
    基础 = 0.0
    成长 = 0.0
    攻击次数 = 1.0
    基础2 = 0.0
    成长2 = 0.0
    攻击次数2 = 0.0
    基础3 = 0.0
    成长3 = 0.0
    攻击次数3 = 0.0
    CD = 0.0
    # Will添加
    CD倍率 = 1.0
    TP成长 = 0.0
    TP上限 = 0
    TP等级 = 0
    是否主动 = 1
    是否有伤害 = 1
    锁定护石 = 0
    歼灭次数 = 0
    恢复 = 1.0
    倍率 = 1.0
    被动倍率 = 1.0
    基础释放次数 = 0
    演出时间 = 0
    是否有护石 = 0
    关联技能 = ['无']
    关联技能2 = ['无']
    关联技能3 = ['无']
    # Will添加
    冷却关联技能 = ['无']
    冷却关联技能2 = ['无']
    冷却关联技能3 = ['无']


    def 等效百分比(self, 武器类型):
        if self.等级 == 0:
            return 0
        else:
            return int((self.攻击次数 * (self.基础 + self.成长 * self.等级) + self.攻击次数2 * (self.基础2 + self.成长2 * self.等级) + self.攻击次数3 * (
                        self.基础3 + self.成长3 * self.等级)) * (1 + self.TP成长 * self.TP等级) * self.倍率)
                        
    def 等效CD(self, 武器类型):
        # Will修改
        return round(self.CD * self.CD倍率 / self.恢复, 1)
class 弑心镇魂者技能0(主动技能):
    名称 = '连续射击'
    所在等级 = 15
    等级上限 = 60
    基础等级 = 46
    基础 = 2534.645
    成长 = 286.355
    CD = 6.0
    TP成长 = 0.10
    TP上限 = 7

class 弑心镇魂者技能1(被动技能):
    名称 = '特工秘技'
    所在等级 = 15
    等级上限 = 20
    基础等级 = 10
    def 加成倍率(self, 武器类型):
        if self.等级 == 0:
            return 1.0
        else:
            return round(1.1 + 0.02 * self.等级, 5)

class 弑心镇魂者技能2(主动技能):
    名称 = '双弦斩'
    所在等级 = 20
    等级上限 = 60
    基础等级 = 43
    基础 = 2538.262
    成长 = 286.738
    CD = 6.0
    TP成长 = 0.10
    TP上限 = 7

class 弑心镇魂者技能3(主动技能):
    名称 = '月光挥斩'
    所在等级 = 25
    等级上限 = 60
    基础等级 = 41
    基础 = 3471.8
    成长 = 392.2
    CD = 7.0
    TP成长 = 0.10
    TP上限 = 7

class 弑心镇魂者技能4(被动技能):
    名称 = '小太刀精通'
    所在等级 = 20
    等级上限 = 20
    基础等级 = 10

    def 加成倍率(self, 武器类型):
            if self.等级 <= 10:
                return round(1.040 + 0.01 * self.等级, 5)
            if self.等级 > 10:
                return round(1.150 + 0.02 * (self.等级 - 10), 5)
    def 物理攻击力倍率(self, 武器类型):
            if self.等级 <= 10:
                return round(1.040 + 0.01 * self.等级, 5)
            if self.等级 > 10:
                return round(1.150 + 0.02 * (self.等级 - 10), 5)


class 弑心镇魂者技能5(主动技能):
    名称 = '满月斩'
    所在等级 = 35
    等级上限 = 60
    基础等级 = 36
    基础 = 6944.629
    成长 = 784.371
    CD = 15.0
    TP成长 = 0.10
    TP上限 = 7
    演出时间 = 0.8


class 弑心镇魂者技能6(主动技能):
    名称 = '迅步突袭'
    所在等级 = 15
    等级上限 = 60
    基础等级 = 46
    基础 = 2236.445
    成长 = 252.555
    CD = 5.0
    TP成长 = 0.08
    TP上限 = 7

class 弑心镇魂者技能7(主动技能):
    名称 = '月影秘步'
    所在等级 = 35
    等级上限 = 60
    基础等级 = 36
    基础 = 13537.543 / 3
    成长 = 1528.457 / 3
    CD = 20.0
    TP成长 = 0.10
    TP上限 = 7
    是否有护石 = 1
    演出时间 = 2.0

    def 装备护石(self):
        self.倍率 *= 1.18
        self.CD *= 0.85

class 弑心镇魂者技能8(主动技能):
    名称 = '锁定射击'
    所在等级 = 40
    等级上限 = 60
    基础等级 = 33
    基础 = 12421.125 / 12
    成长 = 1402.875 / 12
    CD = 20.0
    TP成长 = 0.10
    TP上限 = 7
    是否有护石 = 1
    演出时间 = 1.6
    锁定护石 = 0

    def 装备护石(self):
        self.倍率 *= 1.05
        self.锁定护石 = 1

class 弑心镇魂者技能9(主动技能):
    名称 = '枪刃旋杀'
    所在等级 = 45
    等级上限 = 60
    基础等级 = 31
    基础 = 24218.3
    成长 = 2735.7
    CD = 45.0
    TP成长 = 0.10
    TP上限 = 7
    是否有护石 = 1
    演出时间 = 4.5

    def 装备护石(self):
        self.倍率 *= 1.1795

class 弑心镇魂者技能10(主动技能):
    名称 = '终极锁定'
    所在等级 = 60
    等级上限 = 60
    基础等级 = 23
    基础 = 18100.182
    成长 = 2043.818
    CD = 30.0
    TP成长 = 0.10
    TP上限 = 7
    是否有护石 = 1
    演出时间 = 1.2

    def 装备护石(self):
        self.倍率 *= 1.23
        self.CD *= 0.90

class 弑心镇魂者技能11(被动技能):
    名称 = '使命觉悟'
    所在等级 = 48
    等级上限 = 40
    基础等级 = 20

    def 加成倍率(self, 武器类型):
        if self.等级 == 0:
            return 1.0
        else:
            return round(1.025 + 0.02 * self.等级, 5)

class 弑心镇魂者技能12(主动技能):
    名称 = '嗜血绝杀'
    所在等级 = 50
    等级上限 = 40
    基础等级 = 12
    基础 = 47000.888 
    成长 = 14190.726 
    CD = 145.0

        
class 弑心镇魂者技能13(主动技能):
    名称 = '月相轮舞'
    所在等级 = 70
    等级上限 = 40
    基础等级 = 18
    基础 = 28401.1765
    成长 = 3206.8235
    CD = 50.0
    TP成长 = 0.10
    TP上限 = 7
    是否有护石 = 1
    演出时间 = 1.0

    def 装备护石(self):
        self.倍率 *= 1.20
        self.CD *= 0.90

class 弑心镇魂者技能14(主动技能):
    名称 = '月光镇魂曲'
    所在等级 = 75
    等级上限 = 40
    基础等级 = 16
    基础 = 50658.2667
    成长 = 5719.7333
    CD = 40.0



class 弑心镇魂者技能15(被动技能):
    名称 = '冷酷杀意'
    所在等级 = 75
    等级上限 = 40
    基础等级 = 11

    def 加成倍率(self, 武器类型):
        if self.等级 == 0:
            return 1.0
        else:
            return round(1.22 + 0.02 * self.等级, 5)

class 弑心镇魂者技能16(主动技能):
    名称 = '毁灭狂欢'
    所在等级 = 80
    等级上限 = 40
    基础等级 = 13
    基础 = 50070.8334
    成长 = 5654.1666
    CD = 40.0
    演出时间 = 1.5
    歼灭次数 = 0

class 弑心镇魂者技能17(主动技能):
    名称 = '精准射击'
    所在等级 = 30
    等级上限 = 60
    基础等级 = 38
    基础 = 4459.4055
    成长 = 503.5946
    CD = 8.0
    TP成长 = 0.10
    TP上限 = 7
    演出时间 = 0.5

class 弑心镇魂者技能18(主动技能):
    名称 = '月相天陨'
    所在等级 = 85
    等级上限 = 40
    基础等级 = 5
    基础 = 98670.75
    成长 = 29781.25
    CD = 180.0

class 弑心镇魂者技能19(被动技能):
    名称 = '卓越之力'
    所在等级 = 95
    等级上限 = 40
    基础等级 = 4

    def 加成倍率(self, 武器类型):
        if self.等级 == 0:
            return 1.0
        else:
            return round(1.18 + 0.02 * self.等级, 5)

class 弑心镇魂者技能20(被动技能):
    名称 = '超卓之心'
    所在等级 = 95
    等级上限 = 11
    基础等级 = 1

    def 加成倍率(self, 武器类型):
        if self.等级 == 0:
            return 1.0
        else:
            return round(1.045 + 0.005 * self.等级, 5)

class 弑心镇魂者技能21(被动技能):
    名称 = '觉醒之抉择'
    所在等级 = 100
    等级上限 = 40
    基础等级 = 2
    关联技能 = ['无']

    def 加成倍率(self, 武器类型):
        if self.等级 == 0:
            return 1.0
        else:
            return round(1.10 + 0.05 * self.等级, 5)

弑心镇魂者技能列表 = []
i = 0
while i >= 0:
    try:
        exec('弑心镇魂者技能列表.append(弑心镇魂者技能'+str(i)+'())')
        i += 1
    except:
        i = -1

弑心镇魂者技能序号 = dict()
for i in range(len(弑心镇魂者技能列表)):
    弑心镇魂者技能序号[弑心镇魂者技能列表[i].名称] = i

弑心镇魂者一觉序号 = 0
弑心镇魂者二觉序号 = 0
弑心镇魂者三觉序号 = 0
for i in 弑心镇魂者技能列表:
    if i.所在等级 == 50:
        弑心镇魂者一觉序号 = 弑心镇魂者技能序号[i.名称]
    if i.所在等级 == 85:
        弑心镇魂者二觉序号 = 弑心镇魂者技能序号[i.名称]
    if i.所在等级 == 100:
        弑心镇魂者三觉序号 = 弑心镇魂者技能序号[i.名称]

弑心镇魂者护石选项 = ['无']
for i in 弑心镇魂者技能列表:
    if i.是否有伤害 == 1 and i.是否有护石 == 1:
        弑心镇魂者护石选项.append(i.名称)

弑心镇魂者符文选项 = ['无']
for i in 弑心镇魂者技能列表:
    if i.所在等级 >= 20 and i.所在等级 <= 80 and i.所在等级 != 50 and i.是否有伤害 == 1:
        弑心镇魂者符文选项.append(i.名称)

class 弑心镇魂者角色属性(角色属性):

    职业名称 = '弑心镇魂者'

    武器选项 = ['小太刀']
    
    #'物理百分比','魔法百分比','物理固伤','魔法固伤'
    伤害类型选择 = ['物理百分比']
    
    #默认
    伤害类型 = '物理百分比'
    防具类型 = '皮甲'
    防具精通属性 = ['力量']

    主BUFF = 2.00
   
    #基础属性(含唤醒)
    基础力量 = 920
    基础智力 = 830
    
    #适用系统奶加成
    力量 = 基础力量
    智力 = 基础智力

    #人物基础 + 唤醒
    物理攻击力 = 65.0
    魔法攻击力 = 65.0
    独立攻击力 = 1045.0
    火属性强化 = 13
    冰属性强化 = 13
    光属性强化 = 13
    暗属性强化 = 13
  
    def __init__(self):
        self.技能栏= copy.deepcopy(弑心镇魂者技能列表)
        self.技能序号= copy.deepcopy(弑心镇魂者技能序号)

    def 伤害计算(self, x = 0):
        
        self.所有属性强化(self.进图属强)
        # Will添加
        self.CD倍率计算()
        self.加算冷却计算()

        self.被动倍率计算()
        self.伤害指数计算()

        技能释放次数=[]
        技能单次伤害=[]
        技能总伤害=[]
        歼灭次数=[]
    
        #技能单次伤害计算
        for i in self.技能栏:
            if i.是否有伤害==1:
                技能单次伤害.append(i.等效百分比(self.武器类型)*self.伤害指数*i.被动倍率)
            else:
                技能单次伤害.append(0)
      
        #技能释放次数计算
        for i in self.技能栏:
            if i.名称 == '毁灭狂欢':
                if self.次数输入[self.技能序号[i.名称]] =='/CD':
                    i.歼灭次数 += (int((self.时间输入 - i.演出时间)/i.等效CD(self.武器类型) + 1 +i.基础释放次数))
                else:
                    i.歼灭次数 += (int(self.次数输入[self.技能序号[i.名称]])+i.基础释放次数)
        for i in self.技能栏:
            if i.是否有伤害==1 and i.名称 != '月影秘步' and i.名称 != '锁定射击':
                if self.次数输入[self.技能序号[i.名称]] =='/CD':
                    技能释放次数.append(int((self.时间输入 - i.演出时间)/i.等效CD(self.武器类型) + 1 +i.基础释放次数))
                else:
                    技能释放次数.append(int(self.次数输入[self.技能序号[i.名称]])+i.基础释放次数)
            elif i.名称 == '月影秘步':
                if self.次数输入[self.技能序号[i.名称]] =='/CD':
                    技能释放次数.append(int((self.时间输入 - i.演出时间)/i.等效CD(self.武器类型) + 1 +i.基础释放次数)*3)
                else:
                    技能释放次数.append(int(self.次数输入[self.技能序号[i.名称]])+i.基础释放次数)
            elif i.名称 == '锁定射击':
                if self.次数输入[self.技能序号[i.名称]] =='/CD' and self.技能栏[self.技能序号['锁定射击']].锁定护石==1:
                    技能释放次数.append(int(int((self.时间输入 - i.演出时间)/i.等效CD(self.武器类型) + 1 +i.基础释放次数)*12)+(int(self.技能栏[self.技能序号['毁灭狂欢']].歼灭次数 *6)))
                elif self.次数输入[self.技能序号[i.名称]] =='/CD' and self.技能栏[self.技能序号['锁定射击']].锁定护石==0:
                    技能释放次数.append(int((self.时间输入 - i.演出时间)/i.等效CD(self.武器类型) + 1 +i.基础释放次数)*12)
                else:
                    技能释放次数.append(int(self.次数输入[self.技能序号[i.名称]])+i.基础释放次数)
            else:
                技能释放次数.append(0)
    
        #单技能伤害合计
    
        for i in self.技能栏:
            if i.是否有伤害==1 and 技能释放次数[self.技能序号[i.名称]] != 0:
                技能总伤害.append(技能单次伤害[self.技能序号[i.名称]]*技能释放次数[self.技能序号[i.名称]]*(1+self.白兔子技能*0.20+self.年宠技能*0.10*self.宠物次数[self.技能序号[i.名称]]/技能释放次数[self.技能序号[i.名称]]+self.斗神之吼秘药*0.12))
            else:
                技能总伤害.append(0)
    
        总伤害=0
        for i in self.技能栏:
            总伤害+=技能总伤害[self.技能序号[i.名称]]
        
        if x==0:
            return 总伤害
    
        if x==1:
            详细数据=[]
            for i in range(0,len(self.技能栏)):
                详细数据.append(技能释放次数[i])
                详细数据.append(技能总伤害[i])
                if 技能释放次数[i]!=0:
                    详细数据.append(技能总伤害[i]/技能释放次数[i])
                else:
                    详细数据.append(0)
                if 总伤害!=0:
                    详细数据.append(技能总伤害[i]/总伤害*100)
                else:
                    详细数据.append(0)
            return 详细数据

class 弑心镇魂者(角色窗口):
    def 窗口属性输入(self):
        self.初始属性 = 弑心镇魂者角色属性()
        self.角色属性A = 弑心镇魂者角色属性()
        self.角色属性B = 弑心镇魂者角色属性()
        self.一觉序号 = 弑心镇魂者一觉序号
        self.二觉序号 = 弑心镇魂者二觉序号
        self.三觉序号 = 弑心镇魂者三觉序号
        self.护石选项 = copy.deepcopy(弑心镇魂者护石选项)
        self.符文选项 = copy.deepcopy(弑心镇魂者符文选项)
